/*
 * The Extension Request Listener
 * request should contain a method for action checking and many other useful arguments
 */
var CTEngine ={
  /*
   * For Chrome extension Request Listener
   * request should at least have a method
   * callback arguments will contain a response object and request
   */
listener: function(request, sender, callback)
          {
            // createTab should have a argument for url
            // sender should have a url
            switch(request.method){
              case 'createTab':
                chrome.tabs.create({url:request.url});
                break;
              case 'ajaxRequest':
                CTEngine.sendAjaxRequest(
                  request.ajaxMethod, request.url, request.async,
                  //successCallback
                  callback);
                break;
              case 'readChromeFile':
                CTEngine.readChromeFile(request.url, callback);
                break;
              case 'getLocalBookmarkTree':
                chrome.bookmarks.getTree(callback);
                break;
              case 'useGoogleJSAPI':
                callback(google);
                break;
            }
          },

          /*
           * Send Ajax Request
           */
sendAjaxRequest: function(method, url, async, successCallback)
                 {
                   var xhr = new XMLHttpRequest();
                   xhr.onreadystatechange = function() {
                     if(xhr.readyState==4){
                       switch(xhr.status){
                         // The html request finish right
                         case 200:
                           successCallback(xhr.responseText);
                           break;
                           // The template file read
                         case 0:
                           successCallback('@ERROR QJGui@');
                           break;
                       }
                     }
                   }
                   xhr.open(method , url, async);
                   xhr.send();
                 },

                 /*
                  * Read chrome File
                  */
readChromeFile: function(url, callback)
                {
                  var xhr = new XMLHttpRequest();
                  xhr.onreadystatechange = function() {
                    if(xhr.readyState==4){
                      switch(xhr.status){
                        case 0:
                          callback(xhr.responseText);
                          break;
                      }
                    }
                  }
                  xhr.open('GET' , url, true);
                  xhr.send();
                },

                /*
                 * Get the tranditional Day of China
                 */
getChineseTraditionalDay: function()
                           {
                             var CalendarData=new Array(20);
                             var madd=new Array(12);
                             var TheDate=new Date();
                             var tgString="甲乙丙丁戊己庚辛壬癸";
                             var dzString="子丑寅卯辰巳午未申酉戌亥";
                             var numString="一二三四五六七八九十";
                             var monString="正二三四五六七八九十冬腊";
                             var weekString="日一二三四五六";
                             var sx="鼠牛虎兔龙蛇马羊猴鸡狗猪";
                             var cYear;
                             var cMonth;
                             var cDay;
                             var cHour;
                             var cDateString;
                             var DateString;
                             var Browser=navigator.appName;
                             function init(){
                                 CalendarData[0]=0x41A95;
                                 CalendarData[1]=0xD4A;
                                 CalendarData[2]=0xDA5;
                                 CalendarData[3]=0x20B55;
                                 CalendarData[4]=0x56A;
                                 CalendarData[5]=0x7155B;
                                 CalendarData[6]=0x25D;
                                 CalendarData[7]=0x92D;
                                 CalendarData[8]=0x5192B;
                                 CalendarData[9]=0xA95;
                                 CalendarData[10]=0xB4A;
                                 CalendarData[11]=0x416AA;
                                 CalendarData[12]=0xAD5;
                                 CalendarData[13]=0x90AB5;
                                 CalendarData[14]=0x4BA;
                                 CalendarData[15]=0xA5B;
                                 CalendarData[16]=0x60A57;
                                 CalendarData[17]=0x52B;
                                 CalendarData[18]=0xA93;
                                 CalendarData[19]=0x40E95;
                                 madd[0]=0;
                                 madd[1]=31;
                                 madd[2]=59;
                                 madd[3]=90;
                                 madd[4]=120;
                                 madd[5]=151;
                                 madd[6]=181;
                                 madd[7]=212;
                                 madd[8]=243;
                                 madd[9]=273;
                                 madd[10]=304;
                                 madd[11]=334;
                             };
                             function GetBit(m,n){return (m>>n)&1;};
                             function e2c(){
                                 var total,m,n,k;
                                 var isEnd=false;
                                 var tmp=TheDate.getYear();
                                 if (tmp<1900) tmp+=1900;
                                 total=(tmp-2001)*365
                                 +Math.floor((tmp-2001)/4)
                                 +madd[TheDate.getMonth()]
                                 +TheDate.getDate()
                                 -23;
                                 if (TheDate.getYear()%4==0&&TheDate.getMonth()>1)
                                     total++;
                                 for(m=0;;m++){
                                     k=(CalendarData[m]<0xfff)?11:12;
                                     for(n=k;n>=0;n--){
                                         if(total<=29+GetBit(CalendarData[m],n)){
                                             isEnd=true;
                                             break;
                                         }
                                         total=total-29-GetBit(CalendarData[m],n);
                                     }
                                     if(isEnd)break;
                                 }
                                 cYear=2001 + m;
                                 cMonth=k-n+1;
                                 cDay=total;
                                 if(k==12){
                                     if(cMonth==Math.floor(CalendarData[m]/0x10000)+1)
                                     cMonth=1-cMonth;
                                     if(cMonth>Math.floor(CalendarData[m]/0x10000)+1)
                                     cMonth--;
                                 }
                                 cHour=Math.floor((TheDate.getHours()+3)/2);
                             };
                             function GetcDateString(){
                                 var tmp="";
                                 tmp+=tgString.charAt((cYear-4)%10); //年干
                                 tmp+=dzString.charAt((cYear-4)%12); //年支
                                 tmp+="年(";
                                 tmp+=sx.charAt((cYear-4)%12);
                                 tmp+=")";
                                 if(cMonth<1){
                                     tmp+="闰";
                                     tmp+=monString.charAt(-cMonth-1);
                                 }
                                 else
                                     tmp+=monString.charAt(cMonth-1);
                                 tmp+="月";
                                 tmp+=(cDay<11)?"初":((cDay<20)?"十":((cDay<30)?"廿":"卅"));
                                 if(cDay%10!=0||cDay==10)
                                     tmp+=numString.charAt((cDay-1)%10);
                                 if(cHour==13)tmp+="夜";
                                     tmp+=dzString.charAt((cHour-1)%12);
                                 tmp+="时";
                                 cDateString=tmp;
                                 return tmp;
                             };
                             function GetDateString(){
                                 var tmp="";
                                 var t1=TheDate.getYear();
                                 if (t1<1900)t1+=1900;
                                 tmp+=t1
                                 +"-"
                                 +(TheDate.getMonth()+1)+"-"
                                 +TheDate.getDate()+" "
                                 +TheDate.getHours()+":"
                                 +((TheDate.getMinutes()<10)?"0":"")
                                 +TheDate.getMinutes()
                                 +" 星期"+weekString.charAt(TheDate.getDay());
                                 DateString=tmp;
                                 return tmp;
                             };
                             init();
                             e2c();
                             GetDateString();
                             GetcDateString();
                             return cDateString;
                           },

                           /*
                            * Refresh Data
                            * Chinese Traditional day
                            */
refreshData: function()
             {
               google.chineseTraditionalDay = CTEngine.getChineseTraditionalDay();
             },

             /*
              * Run Every setting time
              * time: s
              */
runService: function(time, callback)
            {
              time = time *1000;
              setInterval(callback, time);
            }

};


